/// 重命名一批文件
#include <iostream>
#include <string>
#include <sys/io.h>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <vector>

using namespace std;

static void fileSearch(string path, vector<string>& files, string postfix)
{
#ifdef _WIN32
    //文件句柄
    long long hFile = 0;//这个地方需要特别注意，win10用户必须用long long 类型，win7可以用long类型
    //文件信息
    struct _finddata_t fileInfo;
    string pathName;
    /*
        \\* 表示符合的所有文件;
        没有找到即文件夹为空，退出;
        assign 表示把 pathName清空并置为path;
        append 表示在末尾加上字符串;
        c_str 返回一个const char* 的临时指针;
        _findfirst
            搜索与指定的文件名称匹配的第一个实例，若成功则返回第一个实例的句柄，否则返回-1L;
            函数原型：long _findfirst( char *filespec, struct _finddata_t *fileinfo );
    */
    if ( ( hFile = _findfirst(pathName.assign(path).append("\\*").c_str(), &fileInfo) ) == -1)
        return ;

    do {
        cout << path+"\\"+fileInfo.name << endl;
        /*
            文件夹下有 . 和 .. 目录，不能进入搜索;
            _A_SUBDIR 表示文件夹属性;
        */
        if (fileInfo.attrib == _A_SUBDIR) {
            if( 0 == strcmp(fileInfo.name,"..") && 0 == strcmp(fileInfo.name,".") ) {
                // fileSearch(path+"\\"+fileInfo.name);
            }
        } else {
            if (postfix.size() == 0 || (postfix.size() > 0 && (postfix.c_str(), strchr(fileInfo.name, '.')))) {
                files.push_back(pathName.assign(fileInfo.name));
            }
        }
        
    } while ( _findnext(hFile, &fileInfo) == 0 );
    /*
        _findnext 搜索与_findfirst函数提供的文件名称匹配的下一个实例，若成功则返回0，否则返回－1 ;
        _findclose 结束查找;
    */
    _findclose(hFile);
    return ;
#endif
}

int main(int argc, char const *argv[])
{
    if (argc != 4) {
        cout << "please input: cmd <folder> <fileprefix> <postfix>" << endl;
        cout << "Ex: .\BatchRenameFiles.exe D:\sai\opencv\images\hivision\test1\left ff .bmp" << endl;
        return -1;
    }

    string path = argv[1];
    string fmt = argv[2];
    string postfix = argv[3];

    // string path = "D:\\sai\\opencv\\images\\hivision\\test1\\left";
    // string fmt = "";
    // string postfix = ".bmp";
    cout << "folder =" << path << endl;
    cout << "file prefix = " << fmt << endl;

    vector<string> files;
    fileSearch(path, files, postfix);

    for (unsigned int i=0; i<files.size(); i++) {
        cout << files[i] << endl;
    }

    return 0;
}
